package rmi;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import map.ConfigDAO;

import entidades.Casillas_correo;
import entidades.Mensajes;


public class ObjetoRemoto extends UnicastRemoteObject implements InterfazRemota{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public ObjetoRemoto() throws RemoteException {
		super();
		// TODO Auto-generated constructor stub
	}



	@Override
	public Vector<Mensajes> listarCorreos(int id_casilla) throws RemoteException {
		Vector<Mensajes> vectorMensajesOrigen =  new Vector<Mensajes>();
		ResultSet rs = null;
		PreparedStatement pstmt = null;
		
		//String query = "select id_mensaje,id_casilla_origen, id_casilla_destino, asunto, texto, fecha,estado, prioridad from mensajes where id_casilla_destino=(?) and destino_borrado=1 ";
		String query = "select m.id_mensaje,(select casilla from casillas_correo where id_casilla = m.id_casilla_origen) id_casilla_origen,(select casilla from casillas_correo where id_casilla = m.id_casilla_destino) id_casilla_destino, m.asunto, m.texto, m.fecha,estado, m.prioridad  from mensajes m inner join casillas_correo c on m.id_casilla_origen = c.id_casilla where id_casilla_destino=(?) and destino_borrado=1";
		Connection con = new ConfigDAO().getConnection();
		try {
			pstmt = con.prepareStatement(query);
			pstmt.setInt(1, id_casilla);
			rs = pstmt.executeQuery();

			
			while (rs.next()){
				Mensajes msgOrig = new Mensajes();
				msgOrig.setId_mensaje(rs.getInt("id_mensaje"));
				msgOrig.setId_casilla_origen((rs.getString("id_casilla_origen")));
				msgOrig.setId_casilla_destino((rs.getString("id_casilla_destino")));
				msgOrig.setAsunto(rs.getString("Asunto"));
				msgOrig.setTexto(rs.getString("texto"));
				msgOrig.setFecha(rs.getDate("fecha"));
				msgOrig.setEstado(rs.getString("estado"));
				msgOrig.setPrioridad(rs.getString("prioridad"));
				vectorMensajesOrigen.add(msgOrig);	
				System.out.println("cargo vector en servidor");

			}
			pstmt.getConnection().close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return vectorMensajesOrigen;
		// TODO Auto-generated method stub
		
	}

	public Vector<Mensajes> listarCorreosEnviados(int id_casilla) throws RemoteException {
		Vector<Mensajes> vectorMensajesOrigen =  new Vector<Mensajes>();
		ResultSet rs = null;
		PreparedStatement pstmt = null;
		
		String query = "select m.id_mensaje,(select casilla from casillas_correo where id_casilla = m.id_casilla_origen) id_casilla_origen,(select casilla from casillas_correo where id_casilla = m.id_casilla_destino) id_casilla_destino, m.asunto, m.texto, m.fecha,estado, m.prioridad  from mensajes m inner join casillas_correo c on m.id_casilla_origen = c.id_casilla where id_casilla_origen=(?) and origen_borrado=1";
		Connection con = new ConfigDAO().getConnection();
		try {
			pstmt = con.prepareStatement(query);
			pstmt.setInt(1, id_casilla);
			rs = pstmt.executeQuery();

			
			while (rs.next()){
				Mensajes msgOrig = new Mensajes();
				msgOrig.setId_mensaje(rs.getInt("id_mensaje"));
				msgOrig.setId_casilla_origen((rs.getString("id_casilla_origen")));
				msgOrig.setId_casilla_destino((rs.getString("id_casilla_destino")));
				msgOrig.setAsunto(rs.getString("Asunto"));
				msgOrig.setTexto(rs.getString("texto"));
				msgOrig.setFecha(rs.getDate("fecha"));
				msgOrig.setEstado(rs.getString("estado"));
				msgOrig.setPrioridad(rs.getString("prioridad"));
				vectorMensajesOrigen.add(msgOrig);	
				System.out.println("cargo vector en servidor");

			}
			pstmt.getConnection().close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return vectorMensajesOrigen;
		// TODO Auto-generated method stub
		
	}


	public int conectar(String casilla, String password) throws RemoteException {
		int retornoIdCasilla=-1;
		ResultSet rs = null;
		PreparedStatement pstmt = null;
		
		String query = "select id_casilla from casillas_correo where casilla=(?) and contrasena=(?)";
		Connection con = new ConfigDAO().getConnection();
		try {
			pstmt = con.prepareStatement(query);
			pstmt.setString(1, casilla);
			pstmt.setString(2, password);
			rs = pstmt.executeQuery();

			
			while (rs.next()){
				retornoIdCasilla= rs.getInt("id_casilla");
			}
			pstmt.getConnection().close();
			
		} catch (SQLException e) {

			e.printStackTrace();
		}
		return retornoIdCasilla;

	}



	@Override
	public int eliminarCorreo(int id_casilla, int id_mensaje) throws RemoteException {
		int retorno = 0;
		PreparedStatement pstmt = null;
		
		String query = "update mensajes set destino_borrado = (?) where id_mensaje = (?)";
		Connection con = new ConfigDAO().getConnection();
		
		try {
			pstmt = con.prepareStatement(query);
			pstmt.setInt(1, id_casilla);
			pstmt.setInt(2, id_mensaje);
			pstmt.executeQuery();
			pstmt.getConnection().close();
			retorno = 1;
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return retorno;
		
	}

	public int eliminarCorreoEnviado(int id_casilla, int id_mensaje) throws RemoteException {
		int retorno = 0;
		PreparedStatement pstmt = null;
		
		String query = "update mensajes set origen_borrado = (?) where id_mensaje = (?)";
		Connection con = new ConfigDAO().getConnection();
		
		try {
			pstmt = con.prepareStatement(query);
			pstmt.setInt(1, id_casilla);
			pstmt.setInt(2, id_mensaje);
			pstmt.executeQuery();
			pstmt.getConnection().close();
			retorno = 1;
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return retorno;
		
	}



	@Override
	public void enviarCorreo(String casilla_origen, String casilla_destino, String asunto, String texto, String fecha, String estado, String prioridad){
		String spName = "{call dbo.enviar_mensaje (?,?,?,?,?,?,?)}";
		Connection con = new ConfigDAO().getConnection();
		CallableStatement cstmt = null;
		
		try {
			cstmt = con.prepareCall(spName);
			cstmt.setString(1, casilla_origen);
			cstmt.setString(2, casilla_destino);
			cstmt.setString(3, asunto);
			cstmt.setString(4, texto);
			cstmt.setString(5, fecha);
			cstmt.setString(6, estado);
			cstmt.setString(7, prioridad);
			cstmt.executeUpdate();
			cstmt.getConnection().close();

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}



	@Override
	public void enviarCorreoGuardado(String id_mensaje,String casilla_origen, String casilla_destino, String asunto, String texto, String fecha, String estado, String prioridad){
		String spName = "{call dbo.enviar_mensaje_guardado (?,?,?,?,?,?,?,?)}";
		Connection con = new ConfigDAO().getConnection();
		CallableStatement cstmt = null;
		
		try {
			cstmt = con.prepareCall(spName);
			cstmt.setString(1, id_mensaje);
			cstmt.setString(2, casilla_origen);
			cstmt.setString(3, casilla_destino);
			cstmt.setString(4, asunto);
			cstmt.setString(5, texto);
			cstmt.setString(6, fecha);
			cstmt.setString(7, estado);
			cstmt.setString(8, prioridad);
			cstmt.executeUpdate();
			cstmt.getConnection().close();

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}




	public Vector<Casillas_correo> listarCasillas() throws RemoteException {
		Vector<Casillas_correo> vectorCasillasCorreo =  new Vector<Casillas_correo>();
		ResultSet rs = null;
		PreparedStatement pstmt = null;
		
		String query = "select * from casillas_correo";
		Connection con = new ConfigDAO().getConnection();
		try {
			pstmt = con.prepareStatement(query);
			rs = pstmt.executeQuery();

			
			while (rs.next()){
				Casillas_correo casillas_correo = new Casillas_correo();
				casillas_correo.setId_casilla(rs.getInt("id_casilla"));
				casillas_correo.setId_usuario(rs.getInt("id_usuario"));
				casillas_correo.setCasilla(rs.getString("casilla"));
				casillas_correo.setContrasena(rs.getString("contrasena"));
				vectorCasillasCorreo.add(casillas_correo);	
				System.out.println("cargo vector de casillas en el servidor");

			}
			pstmt.getConnection().close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return vectorCasillasCorreo;
		// TODO Auto-generated method stub
		
	}
	
	

}
